#include "FastJsoncpp.h"

int FastJsoncpp::GET_INT(const Json::Value& node, const std::string& name, int default_value)
{
    if (node.isNull() || !node.isObject())
        return default_value;

    Json::Value n = node.get(name, Json::Value());
    if (n.isNull() || !n.isNumeric())
        return default_value;
    return n.asInt();
}

int64_t FastJsoncpp::GET_INT64(const Json::Value& node, const std::string& name, int64_t default_value)
{
    if (node.isNull() || !node.isObject())
        return default_value;

    Json::Value n = node.get(name, Json::Value());
    if (n.isNull() || !n.isNumeric())
        return default_value;
    return n.asInt64();
}

std::string FastJsoncpp::GET_STR(const Json::Value& node, const std::string& name, const std::string& default_value)
{
    if (node.isNull() || !node.isObject())
        return default_value;

    Json::Value n = node.get(name, Json::Value());
    if (n.isNull() || !n.isString())
        return default_value;
    return n.asString();
}

bool FastJsoncpp::GET_BOOL(const Json::Value& node, const std::string& name, bool default_value)
{
    if (node.isNull() || !node.isObject())
        return default_value;

    Json::Value n = node.get(name, Json::Value());
    if (n.isNull() || !n.isBool())
        return default_value;
    return n.asBool();
}

double FastJsoncpp::GET_DOUBLE(const Json::Value& node, const std::string& name, double default_value)
{
    if (node.isNull() || !node.isObject())
        return default_value;

    Json::Value n = node.get(name, Json::Value());
    if (n.isNull() || !n.isDouble())
        return default_value;
    return n.asDouble();
}

Json::Value FastJsoncpp::parse(const std::string& content)
{
    Json::Reader reader;
    Json::Value value;
    if (!reader.parse(content, value))
        return Json::Value();

    return value;
}

std::string FastJsoncpp::toString(const Json::Value& value, bool withstyle)
{
    if (withstyle)
    {
        return value.toStyledString();
    }

    Json::FastWriter fastw;
    return fastw.write(value);
}
